﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.OleDb;
using System.Data;

namespace Controllers
{
    public class RelojController
    {
        public static List<Reloj> ObtenerTodos(string where, int pagina, int cantidadRegistros)
        {
            var list = new List<Reloj>();

            var sql = "Select TOP " + cantidadRegistros + " r.*, mo.MoRe_Nombre, ma.MaRe_Id, ma.MaRe_Nombre" +
                       " From Superacidos.Reloj r" +
                       " Join Superacidos.Modelo_Reloj mo on mo.MoRe_Id = r.Reloj_ModeloId" +
                       " Join Superacidos.Marca_Reloj ma on ma.MaRe_Id = mo.More_MarcaId";

            if (pagina > 1)
            {
                int limiteAnterior = (pagina - 1) * cantidadRegistros;


                var filtrospaginador = !string.IsNullOrEmpty(where)
                                       ? " Reloj_Id NOT IN " + "(Select TOP " + limiteAnterior +
                                         " Reloj_Id from Superacidos.Reloj WHERE " + where +
                                         " ORDER BY Reloj_Id) "
                                       : " Reloj_Id NOT IN " + "(Select TOP " + limiteAnterior +
                                         " Reloj_Id from Superacidos.Reloj ORDER BY Reloj_Id) ";

                if (!string.IsNullOrEmpty(where))
                {
                    where += " AND ";
                }
                where += filtrospaginador;
            }


            if (!string.IsNullOrEmpty(where))
            {
                sql += " WHERE " + where;
            }

            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    list.Add(ObtenerObjeto(reader));
                }
            }

            return list;
        }

        

        public static bool ExisteElNumeroSerie(string numeroSerie, Reloj reloj)
        {

            var sql = "Select count(*) as Cantidad From Superacidos.Reloj WHERE Reloj_NumeroSerie = " + numeroSerie;
            if (reloj != null)
            {
                sql += " AND Reloj_Id <> " + reloj.Reloj_Id;
            }

            var cantidad = 0;
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                reader.Read();
                if (reader["Cantidad"] != DBNull.Value)
                    cantidad = (int)reader["Cantidad"];

            }

            return cantidad > 0;
        }

        public static int ObtenerCantidad(string where)
        {
            var sql = "Select count(*) as Cantidad  From Superacidos.Reloj r" +
                       " Join Superacidos.Modelo_Reloj mo on mo.MoRe_Id = r.Reloj_ModeloId" +
                       " Join Superacidos.Marca_Reloj ma on ma.MaRe_Id = mo.More_MarcaId";

            if (!string.IsNullOrEmpty(where))
            {
                sql += " WHERE " + where;
            }
            var cantidad = 0;
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                reader.Read();
                if (reader["Cantidad"] != DBNull.Value)
                    cantidad = (int)reader["Cantidad"];

            }

            return cantidad;
        }

        public static List<Reloj> ObtenerTodosHabilitados(bool noAsignados, int relojId)
        {
            string where = " Reloj_Habilitado = 1 ";
            if (noAsignados)
            {
                where += " AND Reloj_Id not in (Select Auto_RelojId FROM Superacidos.Auto WHERE Auto_RelojId <> " + relojId + ")";
            }
            
            return ObtenerTodos(where);
        }

        public static List<Reloj> ObtenerTodos(string where)
        {
            var list = new List<Reloj>();
            //Default para titulo del cbo
            var relojDefault = new Reloj();
            relojDefault.Reloj_Id= 0;
            relojDefault.Reloj_NumeroSerie = "Seleccionar Numero de Serie";
            list.Add(relojDefault);
            //Cargo todos
            var sql = "Select r.*, mo.MoRe_Nombre, ma.MaRe_Id, ma.MaRe_Nombre " +
                        "From Superacidos.Reloj r " +
                        "Join Superacidos.Modelo_Reloj mo on mo.MoRe_Id = r.Reloj_ModeloId " +
                        "Join Superacidos.Marca_Reloj ma on ma.MaRe_Id = mo.More_MarcaId ";

            if (!string.IsNullOrEmpty(where))
            {
                sql += " WHERE " + where;
            }
            sql += " ORDER BY r.Reloj_NumeroSerie ";

            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    list.Add(ObtenerObjeto(reader));
                }
            }

            return list;
        }

       
        public static Reloj ObtenerUno(int relojId)
        {
            var sql = "Select r.*, mo.MoRe_Nombre, ma.MaRe_Id, ma.MaRe_Nombre " +
                       "From Superacidos.Reloj r " +
                       "Join Superacidos.Modelo_Reloj mo on mo.MoRe_Id = r.Reloj_ModeloId " +
                       "Join Superacidos.Marca_Reloj ma on ma.MaRe_Id = mo.More_MarcaId " +
                       "Where Reloj_Id = " + relojId;
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);
            if (reader.HasRows)
            {
                reader.Read();
                return ObtenerObjeto(reader);
            }
            else
            {
                return null;
            }

        }


        public static List<MarcaReloj> ObtenerMarcas(int marcaId)
        {
            var list = new List<MarcaReloj>();
            //Default para titulo del cbo
            var marcaDefault = new MarcaReloj();
            marcaDefault.MaRe_Id = 0;
            marcaDefault.MaRe_Nombre = "Seleccionar Marca";
            list.Add(marcaDefault);
            //Cargo todas
            var sql = "Select * From Superacidos.Marca_Reloj";
            if (marcaId != 0)
            {
                sql += " WHERE MaRe_Id = " + marcaId;
            }
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    list.Add(ObtenerMarcaReloj(reader));
                }
            }

            return list;
        }

        public static List<ModeloReloj> ObtenerModelos(int marcaId)
        {
            var list = new List<ModeloReloj>();
            //Default para titulo del cbo
            var modeloDefault = new ModeloReloj();
            modeloDefault.MoRe_Id = 0;
            modeloDefault.MoRe_Nombre = "Seleccionar Modelo";
            list.Add(modeloDefault);
            //Cargo todos
            var sql = "Select * From Superacidos.Modelo_Reloj Where More_MarcaId = " + marcaId;
            var reader = ConexionBaseDeDatos.GetData(sql, CommandType.Text);

            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    list.Add(ObtenerModeloReloj(reader));
                }
            }

            return list;
        }


        public static Reloj ObtenerObjeto(OleDbDataReader reader)
        {
            var reloj = new Reloj();
            var modelo = new ModeloReloj();
            var marca = new MarcaReloj();

            //Marca del Modelo del Reloj
            if (reader["MaRe_Id"] != DBNull.Value)
                marca.MaRe_Id = (int)reader["MaRe_Id"];
            if (reader["MaRe_Nombre"] != DBNull.Value)
                marca.MaRe_Nombre = (string)reader["MaRe_Nombre"];

            //Modelo del Reloj
            if (reader["Reloj_ModeloId"] != DBNull.Value)
                modelo.MoRe_Id = (int)reader["Reloj_ModeloId"];
            if (reader["MoRe_Nombre"] != DBNull.Value)
                modelo.MoRe_Nombre = (string)reader["MoRe_Nombre"];
            modelo.MoRe_Marca = marca;
            
            //Reloj
            if (reader["Reloj_Id"] != DBNull.Value)
                reloj.Reloj_Id = (int)reader["Reloj_Id"];
            if (reader["Reloj_NumeroSerie"] != DBNull.Value)
                reloj.Reloj_NumeroSerie = (string)reader["Reloj_NumeroSerie"];
            if (reader["Reloj_Fecha_Ver"] != DBNull.Value)
                reloj.Reloj_Fecha_Ver = (DateTime)reader["Reloj_Fecha_Ver"];
            if (reader["Reloj_Habilitado"] != DBNull.Value)
                reloj.Reloj_Habilitado = (bool)reader["Reloj_Habilitado"];
            reloj.Reloj_Modelo = modelo;
           
            return reloj;
        }

        public static MarcaReloj ObtenerMarcaReloj (OleDbDataReader reader)
        {
            var marcaReloj = new MarcaReloj();

            if (reader["MaRe_Id"] != DBNull.Value)
                marcaReloj.MaRe_Id= (int)reader["MaRe_Id"];
            if (reader["MaRe_Nombre"] != DBNull.Value)
                marcaReloj.MaRe_Nombre = (string)reader["MaRe_Nombre"];

            return marcaReloj;
        }

        public static ModeloReloj ObtenerModeloReloj(OleDbDataReader reader)
        {
            var modeloReloj = new ModeloReloj();

            if (reader["MoRe_Id"] != DBNull.Value)
                modeloReloj.MoRe_Id = (int)reader["MoRe_Id"];
            if (reader["MoRe_Nombre"] != DBNull.Value)
                modeloReloj.MoRe_Nombre = (string)reader["MoRe_Nombre"];

            return modeloReloj;
        }

        public static void Agregar(Reloj reloj)
        {
            var sql = "INSERT INTO SUPERACIDOS.Reloj (Reloj_ModeloId, Reloj_NumeroSerie, Reloj_Fecha_Ver, Reloj_Habilitado) " +
                       " VALUES ('{0}','{1}',{2},{3})";

             sql = string.Format(sql, reloj.Reloj_Modelo.MoRe_Id, reloj.Reloj_NumeroSerie, 
                             reloj.Reloj_Fecha_Ver.ToString("yyyy-MM-dd"), reloj.Reloj_Habilitado ? "1" : "0");


             ConexionBaseDeDatos.Guardar(sql, CommandType.Text);

        }

        public static void Modificar(Reloj reloj)
        {
            /*Si el modelo no existe lo creo (No va al final, queda comentado por si se vuelve a esta funcionalidad)
            reloj.Reloj_Modelo.MoRe_Id = ModeloRelojController.agregarSiNoExiste(reloj.Reloj_Modelo);*/

            //Modifico el reloj
            var sql = "UPDATE SUPERACIDOS.Reloj set Reloj_ModeloId = '{0}' , Reloj_NumeroSerie = {1}, Reloj_Fecha_Ver = {2}, " +
                      "Reloj_Habilitado = {3}" +
                      "WHERE Reloj_Id = {4}";

            sql = string.Format(sql, reloj.Reloj_Modelo.MoRe_Id, reloj.Reloj_NumeroSerie, reloj.Reloj_Fecha_Ver.ToString("yyyy-MM-dd"),
                                     reloj.Reloj_Habilitado ? "1" : "0",
                                     reloj.Reloj_Id);


            ConexionBaseDeDatos.Guardar(sql, CommandType.Text);

        }

        public static void Eliminar(int relojId)
        {
            var sql = "update SUPERACIDOS.Reloj set reloj_habilitado = 0 where Reloj_Id = " + relojId;
            ConexionBaseDeDatos.Guardar(sql, CommandType.Text);
        }

    }

}

